#include "sim900a.h"
#include "beep.h"

/*
 *函数名称:sim900a_check_cmd
 *函数功能:检查返回信息中是否有指定数据
 *参数str:指定的字符串
 *返回值:检测成功：返回指定数据的在返回信息中的下标值
 *       检测失败：返回NULL
 *备  注:无
 */
char *sim900a_check_cmd(char *str)
{
    char *strx = 0;

    strx = strstr((const char *)ShortMessageRecvBuf_usart2, str);

    return strx;
}

/*
 *函数名称:sim900a_send_cmd
 *函数功能:给SIM900A模块发送AT命令
 *参数cmd:AT命令
 *参数ack:确认信息
 *参数waittime:等待时间
 *返回值:SNED_SUCCEED:发送成功   SEND_FAIL:发送失败
 *备  注:无
 */
u8 sim900a_send_cmd(char *cmd, char *ack, u16 waittime)
{
    u8 res = SNED_SUCCEED;

    // 清空接收缓冲区并重置接收状态
    USART2_RX_STA = 0;
    memset(ShortMessageRecvBuf_usart2, 0, USARTx_REC_LEN);

    if ((u16)cmd <= 0xFF) // 当cmd<=0xFF发送数字
    {
        while (DMA_GetFlagStatus(DMA1_FLAG_TC7) == RESET); // 等待DMA传输完成
        USART2->DR = (u16)cmd;
    }
    else // 当cmd>0xFF发送字符串
    {
        USART2_DMA_SendString(cmd); // 向sim900a模块发送命令
    }

    if (ack && waittime) // 需要等待应答
    {
        while (--waittime) // 等待倒计时
        {
            delay_ms(10);

            if (sim900a_check_cmd(ack)) // 检查回复的消息中是否有ack包含的信息
            {
                break; // 检查成功，跳出循环 ;此时waittime!=0
            }
        }
        if (waittime == 0) // 如果等待倒计时等于0 返回失败
        {
            res = SEND_FAIL;
        }
    }
    return res;
}

/*
 *函数名称:sim900a_send_chmessage_zc
 *函数功能:发送中文短信
 *参数number:电话号码
 *参数content:消息内容
 *返回值:无
 *备  注:两个参数都必须都Unicode字符编码
 */
int sim900a_send_chmessage_zc(char *number, char *content)
{
    char cmd[100];

    if (sim900a_send_cmd("AT+CMGF=1\r\n", "OK", 1000)) // 设置短信文本模式  1:文本模式,0:PDU模式
    {
        printf("AT1失败\r\n");
        return ERROR_AT1;
    }
    if (sim900a_send_cmd("AT+CSCS=\"UCS2\"\r\n", "OK", 1000)) // 设置字符集为UCS2   Unicode字符编码
    {
        printf("AT2失败\r\n");
        return ERROR_AT2;
    }
    if (sim900a_send_cmd("AT+CSCA?\r\n", "OK", 1000)) // 自动获取短信服务中心地址
    {
        printf("AT3失败\r\n");
        return ERROR_AT3;
    }
    if (sim900a_send_cmd("AT+CSMP=17,167,0,25\r\n", "OK", 1000)) // 设置短消息参数    17：用户数据头格式（UDH）长度  167：用户数据编码方案
    {                                                            // 0：表示消息中心是否要求状态报告 25：短消息中心的最大等待时间。
        printf("AT4失败\r\n");
        return ERROR_AT4;
    }

    sprintf((char *)cmd, "AT+CMGS=\"%s\"\r\n", number);
    if (sim900a_send_cmd(cmd, ">", 1000)) // 发送电话号码
    {
        printf("发送电话号码失败\r\n");
        return ERROR_AT5;
    }
    USART2_DMA_SendString(content); // 发送短信内容

    if (sim900a_send_cmd("\x1A", "OK", 3000)) // 发送结束符(CTRL+Z)
    {
        printf("未发送成功\r\n");
        return ERROR_AT6;
    }
}
